package model;

import java.util.Random;

import controller.Main;

/**
 * Controla a lógica do jogo, instanciando o tabuleiro, os jogadores e fazendo
 * passar os turnos.
 */
public class GameManager {
	
	/**
	 * O jogador 1 é sempre humano.
	 */
	private Player player1 = new HumanPlayer(PieceType.PLAYER1);
	
	/**
	 * Jogador 2, pode ser humano ou IA.
	 */
	private Player player2;
	
	/**
	 * O jogador da vez, que irá jogar no próximo turno.
	 */
	private Player playsNow;
	
	/**
	 * O tabuleiro do jogo.
	 */
	private Board board = new Board(6, 7);
	
	/**
	 * Única instância dessa classe, já que é um Singleton.
	 */
	private static GameManager instance = new GameManager();
	
	/**
	 * Construtor privado que só serve para garantir o Singleton.
	 */
	private GameManager() {}
	
	/**
	 * Retorna a única instancia dessa classe que existe.
	 */
	public static GameManager getInstance() {
		return instance;
	}
	
	/**
	 * Começa o jogo, instanciando os jogadores, o tabuleiro e sorteando quem
	 * vai jogar primeiro.
	 */
	public void startGame(GameType type) {
		if (type.equals(GameType.IA_EASY)) {
			player2 = new EasyIA(PieceType.PLAYER2);
		} else if (type.equals(GameType.IA_HARD)) {
			player2 = new HardIA(PieceType.PLAYER2);
		} else {
			player2 = new HumanPlayer(PieceType.PLAYER2);
		}
		if (new Random().nextInt() % 2 == 0) {
			playsNow = player1;
		} else {
			playsNow = player2;
		}
		nextTurn();
	}
	
	/**
	 * Executa o próximo turno do jogo.
	 */
	public void nextTurn() {
		while (playsNow.isReady()) {
			playsNow.play(board);
			if (Rules.gameOver(board)) {
				Main.finish();
				playsNow.youWin();
				return;
			}
			playsNow = (playsNow == player1) ? player2 : player1;
		}
	}

	/**
	 * Informa que será o próximo a jogar.
	 */
	public Player getPlaysNow() {
		return playsNow;
	}
	
	/**
	 * Retorna o tabuleiro do jogo.
	 */
	public Board getBoard() {
		return board;
	}

}
